import { FunUtil } from '../../fun'

/**
 * 将数组转化为映射表
 *
 * @param {any[]} arr 需要转化的数组
 * @param {string | ((item: any) => (string | number | symbol))} key 数组要转化成的
 * 映射表的 key：
 * - 如果传入的是字符串数据作为参数，则默认数组中的元素为对象类型，该参数为数组元素对象的主键字
 * 段名，将数组转化为映射表时，会以数组元素对象的主键字段值作为映射表的 key；
 * - 如果传入的是函数类型作为参数，则会将函数的返回结果作为映射表的 key，该函数将会接收当前正在
 * 遍历处理的数组元素作为参数
 * @returns {Record<string | number | symbol, any>} 转化后的映射表
 */
export const convert2Map = (
  arr: any[],
  key: string | ((item: any) => string | number | symbol)
): Record<string | number | symbol, any> => {
  // 获取映射表 key 的方法
  const getKey = FunUtil.isFun(key) ? key : (item: any) => item[key]
  // 最终要返回的映射表结果
  const result: Record<string | number | symbol, any> = {}
  // 将数组转化为映射表
  for (const item of arr) {
    result[getKey(item)] = item
  }
  return result
}

export type Convert2MapType = typeof convert2Map
